פתרון מוצע לבחינת מה"ט ב_שפת c מועד אביב תשע"ח, פברואר 8102 מחבר: מר שייקה בילו, מכללת אורט רחובות שאלה מספר 1 התוכנית מגדירה חמישה משתנים שלמים: השלושה הראשונים הם שלושה מצביעים - *s *t,i. j ושלושה נוספים הם שני זקיפים r* מבצעים השמה של כתובת המשתנה מקושרים. מבצעים השמה של כתובת המשתנה מקושרים. i לתוך שדה הכתובת של המשתנה s j חתוך שדה הכתובת של המשתנה מבצעים השמה של שדה הכתובת הנמצא בתוך המשתנה המשתנה r כך שהם כעת מקושרים. מבצעים השמה של שדה הכתובת הנמצא בתוך המשתנה המשתנה s כך שהם כעת מקושרים. מבצעים השמה של שדה הכתובת הנמצא בתוך המשתנה המשתנה t כך שהם כעת מקושרים. הדפסה ראשונה: כעת מדפיסים את שני הזקיפים שהוכנסו לאחר האתחול: הדפסה שנייה: t s t r i ו- j 5 7 כך שהם כעת כך שהם כעת לתוך שדה הכתובת של חתוך שדה הכתובת של לתוך שדה הכתובת של ומקבלים על המסך את שני הערכים שלהם כפי במקטע זה התוכנית מבצעת החלפה בין שני המשתנים המקוריים מתמטית בין המצביעים אשר מקושרים לשני המשתנים ערכם של i ו- j התחלפו וב- i יש כעת 7 וב- j יש כעת 5. כעת מדפיסים את שני הזקיפים ההחלפה: הדפסה שלישית: i. ו- j i i ו- j 7 5 במקטע זה התוכנית מבצעת לולאה המתחילה מ- ערכו ע"י ביצוע החלפה ו- j לאחר החלפה המתמטית ומקבלים על המסך את שני הערכים שלהם לאחר i=9 ומתקדמת עד ש- i קטן שווה,01 כלומר מבצעת שני סיבובים. בכל סיבוב נבדק האם המשתנה זקיף i גדול מ- 9 או לחילופין הוא בהפחתה עצמית של 0 קטן מ- 9, כל זמן שהתנאי הזה נכון המשתנה זקיף i עולה ב- 0. בסיבוב הראשוןשל הלולאה יודפס 9 כי הזקיף עומד בתנאי של בהיותו 2 הוא קטן מ- 9 ואז עולה ב- 0 ומודפס הערך.9 בסיבוב השני המשתנה עולה ל- 01 i ונכנס ללולאה ואז נבדק האם הוא גדול מ- 9, כיוון שהתשובה אמת ערכו עולה ב- 0 והוא הזקיף i הופך ל- 00 ואז עמוד 0
מודפס. כיוון שכעת הוא 00 הוא גדול מ- 01 כך שתנאי הקיום של הלולאה מסתיים והתוכנית מבצעת ירידת שורה ומסתיימת. #include<stdio.h> שאלה מספר 2 int func(int data[5][5]) int sumcol = 0, maxcolsum = 0, indexmaxcol, times; int i, j, limit=4, rounds, mod; for (i = 0; i < 5; i++) if (data[0][i] <= limit) for (j = 1; j <= data[0][i]; j++) printf("+%d", data[j][i]); sumcol += data[j][i]; else rounds = data[0][i] / 4; mod = data[0][i] % 4; while (rounds--) for (j = 1; j <= limit; j++) printf("+%d", data[j][i]); sumcol += data[j][i]; for (j = 1; j <= mod; j++) printf("+%d", data[j][i]); sumcol += data[j][i]; printf("=%d", sumcol); if (sumcol > maxcolsum) maxcolsum = sumcol; indexmaxcol = j; printf("\nmatrix Sum Col %d is %d\n\n", i+1, sumcol); sumcol = 0; עמוד 8
return maxcolsum; int main() int data[5][5] = 6,7,4,3,8,1,1,2,1,1,2,1,2,1,2, 3,1,1,2,1,2,1,1,8,2 ; int i, j,maxcolsum; printf("matrix[%d][%d]:\n",5,5); for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) printf("%3d", data[i][j]); printf("\n"); printf("\n"); maxcolsum=func(data); printf("max Col Sum is %d\n", maxcolsum); return 0; Output: Matrix[5][5]: 6 7 4 3 8 1 1 2 1 1 2 1 2 1 2 3 1 1 2 1 2 1 1 8 2 + 1 + 2 + 3 + 2 + 1 + 2 = 11 Matrix Sum Col 1 is 11 + 1 + 1 + 1 + 1 + 1 + 1 + 1 = 7 Matrix Sum Col 2 is 7 + 2 + 2 + 1 + 1 = 6 Matrix Sum Col 3 is 6 + 1 + 1 + 2 = 4 Matrix Sum Col 4 is 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 = 12 Matrix Sum Col 5 is 12 Max Col Sum is 12 עמוד 3
#include <stdio.h> #include <stdlib.h> #include <conio.h> שאלה מספר 3 /* Typedef struct name Node */ typedef struct Node int num; struct Node *next; Node; /* Menu selection */ int menu_select() int c; printf("============ L I S T - 1 =========\n"); printf(" 1. Add New Node to List 1 \n"); printf(" 2. Print List 1 + Count Nodes \n"); printf(" 3. Free List 1 \n"); printf("============ L I S T - 2 =========\n"); printf(" 4. Add New Node to List 2 \n"); printf(" 5. Print List 2 + Count Nodes \n"); printf(" 6. Free List 2 \n"); printf("======== Check Lists Sum =========\n"); printf(" 7. Compere List Nodes Sum \n"); printf("============ Concatenating =======\n"); printf(" 8. Combine List 1 & List 2 \n"); printf(" 9. Print new combined list \n"); printf("10. Free new combined List \n"); printf("11. Exit from program \n"); printf("==================================\n"); do printf("\nenter your choice:"); scanf("%d", &c); while (c<0 c>11); return c; /* Initialize the List with input number.*/ Node *Add(Node *head, int number) Node *tail = head; Node *new_item = (Node*)malloc(sizeof(Node)); new_item->num = number; new_item->next = NULL; if (tail == NULL) return new_item; עמוד 4
while (tail->next!= NULL) tail = tail->next; tail->next = new_item; return head; /* Count Nodes in List */ int Count_List(Node *head) int counter = 0; while (head!= NULL) counter++; head = head->next; return counter; /* Sum Nodes in List */ int Sum_List_Nodes(Node *head) int sum = 0; while (head!= NULL) sum += head->num; head = head->next; return sum; /* Free List */ void Free_List(Node *head) Node *to_free = head; while (to_free!= NULL) head = head->next; free(to_free); to_free = head; printf("the list is free and deleted!!!\n"); /* Display List on screen */ void Print_List(Node *head) Node *p; for (p = head; p!= NULL; p = p->next) עמוד 5
printf("node number is %d next place is %p\n", p- >num, p->next); if (p == NULL) printf("end Of list!!!\n"); return; /* Combine List1 with List2 */ Node *combine_lists(node *List1, Node *List2) Node *List1_head = List1; Node *List2_head = List2; int sumlist1 = 0, sumlist2 = 0; Summing List2 while (List1_head!= NULL) sumlist1 += List1_head->num; List1_head = List1_head->next; Summing List2 while (List2_head!= NULL) sumlist2 += List2_head->num; List2_head = List2_head->next; Chacking Lists sum for concatenating if (sumlist1 > sumlist2) while (List1->next!= NULL) List1 = List1->next; List1->next = List2; Moving on List2 to the end while (List2->next!= NULL) List2 = List2->next; Putting in the last node of List2 the head of List1 List2->next = List1_head; return List1_head; else while (List2->next!= NULL) List2 = List2->next; List2->next = List1; Moving on List1 to the end while (List1->next!= NULL) List1 = List1->next; עמוד 6
List2 Putting in the last node of List1 the head of List1->next = List2_head; return List2_head; /* Main program */ int main() int num = 0; int count; int SumList1 = 0, SumList2 = 0; int choice; int input = 0; Node *head1 = NULL; Node *head2 = NULL; for (;;) choice = menu_select(); switch (choice) case 1: printf("enter number to create new node(-1 to exit):\n"); scanf("%d", &input); while (input!= -1) head1 = Add(head1, input); printf("enter number to create new node(- 1 to exit):\n"); scanf("%d", &input); case 2: printf("list 1:\n"); Print_List(head1); count = Count_List(head1); printf("list 1 as %d Nodes\n", count); case 3: Free_List(head1); case 4: printf("enter number to create new node(-1 to exit):\n"); scanf("%d", &input); while (input!= -1) head2 = Add(head2, input); עמוד 7
printf("enter number to create new node(- 1 to exit):\n"); scanf("%d", &input); case 5: printf("list2:\n"); Print_List(head2); count = Count_List(head2); printf("list2 as %d Nodes\n", count); case 6: Free_List(head2); case 7: SumList1 = Sum_List_Nodes(head1); printf("list1 Sum Nodes: %d\n", SumList1); SumList2 = Sum_List_Nodes(head2); printf("list2 Sum Nodes: %d\n", SumList2); if (SumList1 > SumList2) printf("list1 Nodes sum is Bigger %d\n", SumList1); else printf("list2 Nodes sum is Bigger %d\n", SumList2); case 8: combine_lists(head1, head2); printf("list1 and List2 Combined!!!\n"); case 9: printf("new Combined List:\n"); if (SumList1 > SumList2) Print_List(head1); else Print_List(head2); case 10: Free_List(head1); case 11: exit(0); getch(); system("cls"); return 0; Output: == == == == == == L I S T - 1 == == == == = 1. Add New Node to List 1 2. Print List 1 + Count Nodes 3. Free List 1 עמוד 2
== == == == == == L I S T - 2 == == == == = 4. Add New Node to List 2 5. Print List 2 + Count Nodes 6. Free List 2 == == == == Check Lists Sum == == == == = 7. Compere List Nodes Sum == == == == == == Concatenating == == == = 8. Combine List 1 & List 2 9. Print new combined list 10. Free new combined List 11. Exit from program == == == == == == == == == == == == == == == == == Enter your choice: 9 New Combined List: Node number is 7 next place is 004EF478 Node number is 8 next place is 004EF4D0 Node number is 9 next place is 004EF528 Node number is 6 next place is 0049AAB0 Node number is 2 next place is 004D4A70 Node number is 4 next place is 004D4AC8 Node number is 3 next place is 004D4B20 Node number is 5 next place is 004D4B78 Node number is 6 next place is 004D4BD0 Node number is 7 next place is 00000000 End Of list!!! #include<stdio.h> #include<string.h> #include<stdlib.h> שאלה מספר 4 char *new_str(char *str1, char *str2) int str1len, str2len, str3len, times; char *str3 = NULL; str1len = strlen(str1); str2len = strlen(str2); printf("str1 \"%s\"\tlen=%2d\nstr2 \"%s\"\tlen=%2d\n",str1, str1len, str2, str2len); if (str1len < str2len) printf("str1 is the short one!!!\n"); times = (str2len - str1len + 1); str3len=str1len + (str2len - str1len + 1)*str1len; printf("new Str3 will have length of %d\n", ++str3len); עמוד 9
else str3 = (char *)malloc(str3len * sizeof(char*)); strcpy(str3, str1); while (times) strncat(str3, str2, 4); str2++; times--; printf("str2 is the short one!!!\n"); times = (str1len - str2len + 1); str3len = str2len + (str1len - str2len + 1)*str2len; printf("new Str3 will have length of %d\n", ++str3len); str3 = (char *)malloc(str3len * sizeof(char*)); strcpy(str3, str2); while (times) strncat(str3, str1, 4); str1++; times--; return str3; int main() char *str1 = "abcdefgh"; char *str2 = "good"; Option 2: char *str2 = "abcdefgh"; char *str1 = "good"; Option 3: char *str2 = "abcdefgh"; char *str1 = "goodvibe"; char *str3; str3=new_str(str1, str2); printf("new str3 is \"%s\"\n", str3); return 0; Output 1: Str1 "abcdefgh" length = 8 Str2 "good" length = 4 Str2 is the short one!!! New Str3 will have length of 25 עמוד 01
New str3 is "goodabcdbcdecdefdefgefgh" Output for Option 2 (str1 short then str2): Str1 "good" length = 4 Str2 "abcdefgh" length = 8 Str1 is the short one!!! New Str3 will have length of 25 New str3 is "goodabcdbcdecdefdefgefgh" Output for Option 2 (str1 length equal to str2): /*Str1 "goodvibe" length = 8 Str2 "abcdefgh" length = 8 Str2 is the short one!!! New Str3 will have length of 17 New str3 is "abcdefghgood*/ 1, 4, 6, 8, 9, 11, 14, 16, 18, 19, enter number : 24 Yes!!: 6 18 1, 4, 6, 8, 9, 11, 14, 16, 18, 19, enter number : 21 No!! שאלה מספר 5 א. התוכנית תדפיס את התוצאות הבאות עבור המשתנים: 1, 4, 6, 8, 9, 11, 14, 16, 18, 19, enter number : 17 Yes!!: 1 16 התוכנית מגדירה מערך ומאתחלת אותו ב- 01 מספרים. בנוסף מוגדרים מספר משתנים: שני זקיפים j-וi משתנה דגל flag ומשתנה מספר num המיועד עבור קלט מהמשתמש. התוכנית מדפיס את המערך המאותחל ואז קולטת מהמשתמש מספר שלם ובודקת האם יש במערך זוג מספרים שסכומם שווה לערכו של המספר שנקלט, ברגע שנמצא זוג כזה ערכו של הדגל הופך ל- 0 הלולאה מסתיימת והזוג מודפס יחד עם המילה,Yes!! אחרת מודפס.No!! ב. עמוד 00
שאלה מספר 6 א. התוכנית תדפיס את התוצאות הבאות: 7, 6, 5, 4, 3, הפונקציה הרקורסיבית sec_req() קולטת את המחרוזת של המספרים מהתוכנית הראשית. במידה והמחרוזת ריקה מסיימים את הקריאות הרקורסיביות. בקריאה לרקורסיה נבדק האם ערכו של תו במחרוזת +0 שווה לשכנו מימין. אם התשובה היא כן, הדגל f מקבל את הערך 0 ועוברים לתו הבא ובכך בודקים את הזוג הבא, במידה ולא הופכים את הדגל ל- 1 ושוב בודקים את הזוג הבא. בסיום נקבל את סדרת המספרים שבמחרוזת אשר עומדים בתנאי שיש תמיד אחד מימינם הגדול מהם ב- 0. 4 גדול מ- ב 3 5-0, גדול מ- 4 ב- 0, 6 גדול מ- 5 ב- 0, 7 גדול מ- 6 ב- 0. ל- 0 שבמערך אין שכן 8 וכנ"ל לגבי 9 שאין קטן ממנו ב- 0. ב. שאלה מספר 7 א. ב. התוכנית תדפיס את התוצאות הבאות: hello exam2018 smalllarge הפונקציה func() קולטת מחרוזת הנשלחת מהתוכנית הראשית לתוך מצביע מחרוזתי. מגדירה שני מצביעים *str1 ו- *str2 המיועדים לקליטת מחרוזות בהמשך וכן שלושה זקיפים,i.,j k לשני המצביעים המקומיים מבצעת הפונקציה הקצאת זיכרון בודד אחד מטיפוס תווי וסוגרת את שתי המחרוזות בתו '0\', כמו כן היא מאפסת את שני הזקיפים j ו- k. בהמשך הפונקציה עוברים על המחרוזת שנקלטה עד לסיומה ומבצעים בתוך לולאת המעבר שתי בדיקות: הראשונה בודקת האם התו הנבדק הוא אות גדולה או שווה ל- )97( a במידה וכן מבצעים את הבדיקה השנייה האם התו הנבדק מרחקו מהתו a לפי טבלת אסקי קטן או שווה ל- 38 שהוא המרחק בין )97( a ל- )088(. z משמעות בדיקה זו היא לוודא שהתו שייך לקבוצת האותיות הקטנות. במידה והתשובה היא אמת מגדילים את הזקיף j, מקצים זיכרון נוסף למחרוזת *str1 ומכניסים למחרוזת הראשונה *str1 את התו שנבדק כך שכל האותיות הקטנות בסיום המעבר על המחרוזת ימצאו במחרוזת הראשונה.*str1 אחרת, כלומר אם התו שנבדק ערכו קטן מהתו )97( a לפי טבלת אסקי שהמשמעות היא כי הוא אינו אות קטנה מגדילים את הזקיף k ומקצים זיכרון נוסף למחרוזת *str2 ומכניסים את התו למחרוזת השנייה *str2 כך שכל התווים במחרוזת שאינם אותיות קטנות כלומר אותיות גדולות, ספרות ורווחים יוכנסו למחרוזת.*str2 לאחר סיום המעבר על המחרוזת המקורית כל האותיות הקטנות ימצאו במחרוזת *str וכל שאר התווים ימצאו במחרוזת.*str2 כעת מבצעים שרשור של שתי המחרוזות הראשונה *str1 המכילה את האותיות הקטנות והשנייה *str2 לתוך המחרוזת.*str1 כעת משחררים את הקצאת הזיכרון של המצביע *str2 ומחזירים את כתובת המצביע str1 לתוכנית הראשית. עמוד 08
שאלה מספר 8 א. ב. ג. הפונקציה func() קבלת מספר הקסהדצימלי ומייצרת בתוכה תוך כדי שימוש בהזזות ספרה בינארית שהיא חלק מהמספר הבינארי בעל 2 ספרות המייצג את המספר ההקסהדצימלי שנשלח אליה. ע"י שימוש בלולאה התוכנית שולחת לפונקציה כל פעם מספר כאשר היא מקטינה אותו כל סיבוב וכך אם נדפיס את על ההחזרות של הפונקציה נקבל את המספר הבינארי המיצג את ההקסדצימלי שנשלח. להלן מספר דוגמאות: כאשר נשלח המספר 0x74 מתוך הלולאה נקבל בחזרה אחרי כל הסיבובים את כל הספרות המייצגות אותו בבסיס בינארי: 01110100 אם נתרגם מספר זה למספר דצימלי נקבל 111 שהוא ייצוג של 74 בהקסהדצימלי. כאשר נשלח המספר 0xdc מתוך הלולאה נקבל בחזרה אחרי כל הסיבובים את כל הספרות המייצגות אותו בבסיס בינארי: 00100011 אם נתרגם מספר זה למספר דצימלי נקבל 220 שהוא ייצוג של DC בהקסהדצימלי. כאשר נשלח המספר 0xfe מתוך הלולאה נקבל בחזרה אחרי כל הסיבובים את כל הספרות המייצגות אותו בבסיס בינארי: 00000001 אם נתרגם מספר זה למספר דצימלי נקבל 254 שהוא ייצוג של FE בהקסהדצימלי. כאשר נשלח המספר 0x8b מתוך הלולאה נקבל בחזרה אחרי כל הסיבובים את כל הספרות המייצגות אותו בבסיס בינארי: 01110100 אם נתרגם מספר זה למספר דצימלי נקבל 139 שהוא ייצוג של 8B בהקסהדצימלי. התוכנית מגדירה חמישה משתנים: הראשון num הוא תווי בו מתבצעת השמה של מספר הקסהדצימלי, האחרים הם משתנים שלמים:,i curr,,p err ומאפסת את p ואת.err כעת מתבצעת לולאה אשר מבצעת 2 סיבובים ובכל סיבוב היא שולחת את המספר ההקסהדצימלי לפונקציה לאחר הזזה של מקום אחד ימינה. בכל סיבוב של הלולאה הפונקציה מחזירה ספרה 1 או 0. הערך המוחזר מהפונקציה מסתכם לתוך המשתה p. לאחר סיום הלולאה בתוך המשתנה p יש את מספר ה- 0 המרכיבים את המספר הבינארי שהוא התרגום של המספר ההקסהדצימלי שנשלח לפונקציה כי שניתן לראות בדוגמאות שבסעיף א'. בהמשך נבדק האם המשתנה p הוא אי זוגי, כלומר מספר ה- 0 בו מתחלק ב- 8 עם שארית, במקרה כזה לתוך המשתנה err יוכנס הערך 0 כלומר יש שגיאה ומספר ה- 0 במספר הוא אי זוגי. לאחר מכן ייבדק האם המשתנה err מכיל 1, כלומר מספר ה- 0 במספר הוא זוגי במקרה כזה יודפס: number is OK ונרד שורה, במידה ומספר ה- 0 אינו זוגי יודפס: error ונרד שורה. התוכנית תדפיס את התשובות הבאות: number is OK error error number is OK עבור num = 0x74 יודפס : עבור num = 0xdc יודפס : עבור num = 0xfe יודפס : עבור num = 0x8b יודפס : עמוד 03